import pandas as pd
import matplotlib.pyplot as plt
import matplotlib

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']  # MacOS系统中文显示
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
import os

# 数据文件路径
DATA_FILE = '/Users/suskuku/next-group/project/练习一/FhjlViewDD.xlsx'
OUTPUT_DIR = '/Users/suskuku/next-group/project/练习一/练习一贺语柔/output'

# 创建输出目录
os.makedirs(OUTPUT_DIR, exist_ok=True)

# 读取数据
try:
    df = pd.read_excel(DATA_FILE)
    # 确保日期列是datetime类型
    df['创建时间'] = pd.to_datetime(df['创建时间'])
    # 检查必要列是否存在
    required_columns = ['创建时间', '货品', '净重', '客户', '发货地', '车辆']
    column_mapping = {'车辆': '车牌号'}
    for col in required_columns:
        if col not in df.columns:
            print(f"错误: 数据文件中缺少必要列 '{col}'")
            exit(1)
    
    # 重命名列以匹配分析需求
    df = df.rename(columns=column_mapping)
    
    # 确保日期列正确
    df['日期'] = pd.to_datetime(df['创建时间'])
    
    # 根据货品类型分离数据
    df_mineral = df[df['货品'] == '矿砂'].copy()
    df_cement = df[df['货品'] == '水泥'].copy()
    
    # 重命名净重列为对应的货运量
    df_mineral['矿粉货运量'] = df_mineral['净重']
    df_cement['水泥货运量'] = df_cement['净重']
except Exception as e:
    print(f"读取数据文件时出错: {e}")
    exit(1)

# 任务a: 6月份每日矿粉货运量日趋势柱状图
def task_a():
    june_mineral = df_mineral[df_mineral['日期'].dt.month == 6].groupby(df_mineral['日期'].dt.day)['矿粉货运量'].sum()
    if june_mineral.empty:
        print("警告: 6月份没有矿粉货运数据")
        return
    plt.figure(figsize=(12, 6))
    june_mineral.plot(kind='bar', color='skyblue')
    plt.title('6月份每日矿粉货运量(净重)')
    plt.figtext(0.5, 0.01, '注: 矿粉货运量数据为矿砂净重', ha='center', fontsize=10)
    plt.xlabel('日期')
    plt.ylabel('货运量(吨)')
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.savefig(os.path.join(OUTPUT_DIR, 'task_a.png'))
    plt.close()

# 任务b: 6月份每日水泥货运量日趋势柱状图
def task_b():
    june_cement = df_cement[df_cement['日期'].dt.month == 6].groupby(df_cement['日期'].dt.day)['水泥货运量'].sum()
    if june_cement.empty:
        print("警告: 6月份没有水泥货运数据")
        return
    plt.figure(figsize=(12, 6))
    june_cement.plot(kind='bar', color='lightgreen')
    plt.title('6月份每日水泥货运量(净重)')
    plt.figtext(0.5, 0.01, '注: 水泥货运量数据为水泥净重', ha='center', fontsize=10)
    plt.xlabel('日期')
    plt.ylabel('货运量(吨)')
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.savefig(os.path.join(OUTPUT_DIR, 'task_b.png'))
    plt.close()

# 任务c: 客户6月份货运需求量排序
def task_c():
    customer_demand = pd.concat([
        df_mineral[df_mineral['日期'].dt.month == 6].groupby('客户')['矿粉货运量'].sum(),
        df_cement[df_cement['日期'].dt.month == 6].groupby('客户')['水泥货运量'].sum()
    ], axis=1).sum(axis=1).sort_values(ascending=False)
    customer_demand.to_csv(os.path.join(OUTPUT_DIR, 'task_c.csv'), encoding='utf-8-sig')

# 任务d: 6月份各发货地发货总量饼图
def task_d():
    location_total = pd.concat([
        df_mineral[df_mineral['日期'].dt.month == 6].groupby('发货地')['矿粉货运量'].sum(),
        df_cement[df_cement['日期'].dt.month == 6].groupby('发货地')['水泥货运量'].sum()
    ], axis=1).sum(axis=1)
    plt.figure(figsize=(10, 10))
    location_total.plot(kind='pie', autopct='%1.1f%%')
    plt.title('6月份各发货地发货总量占比(净重)')
    plt.figtext(0.5, 0.01, '注: 货运量数据为净重', ha='center', fontsize=10)
    plt.ylabel('')
    plt.tight_layout()
    plt.savefig(os.path.join(OUTPUT_DIR, 'task_d.png'))
    plt.close()

# 任务e: 6月份各车牌号总货运量排序
def task_e():
    june_mineral = df[(df['日期'].dt.month == 6) & (df['货品'] == '矿粉')].groupby('车牌号')['净重'].sum()
    june_cement = df[(df['日期'].dt.month == 6) & (df['货品'] == '水泥')].groupby('车牌号')['净重'].sum()
    plate_total = pd.concat([june_mineral, june_cement]).groupby('车牌号').sum().sort_values(ascending=False)
    plate_total.to_csv(os.path.join(OUTPUT_DIR, 'task_e.csv'), encoding='utf-8-sig')

# 检查6月矿粉数据是否存在
def check_mineral_data():
    june_mineral = df[(df['日期'].dt.month == 6) & (df['货品'] == '矿粉')]
    if not june_mineral.empty:
        print(f"6月矿粉数据存在，共{june_mineral.shape[0]}条记录")
    else:
        print("警告: 6月份没有矿粉货运数据")

# 执行所有任务
if __name__ == '__main__':
    task_a()
    task_b()
    task_c()
    task_d()
    task_e()
    print(f"所有分析任务已完成，结果保存在{OUTPUT_DIR}文件夹中")